package com.company.UI;

import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.DataInputStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

@Data
@NoArgsConstructor
public class ClientThread extends Thread{
    private Socket client; // 用于接收客户端的 Socket对象
    private ClientChatUI clientWindow; // 用于接收客户端的 UI对象
    private PrivateChatUI privateChatWindow; // 用于接收客户端的私聊窗口 UI对象
    private DataInputStream dis; // 用于缓存每个客户端 socket的 DataInputStream 对象
    // 用于存储多个私聊窗口，key 为对方的用户名
    private Map<String, PrivateChatUI> privateChatWindows = new HashMap<>();

    public ClientThread(Socket client, ClientChatUI clientWindow) {
        this.client = client;
        this.clientWindow = clientWindow;
    }

    // 注册私聊窗口，当私聊窗口创建后调用此方法进行注册
    public void registerPrivateChatWindow(String friendName, PrivateChatUI window) {
        privateChatWindows.put(friendName, window);
    }
    @Override
    public void run() {
        // 线程执行的逻辑
        // 循环接收服务端发送过来的消息
        while (true) {
            try {
                dis = new DataInputStream(client.getInputStream());
                int type = dis.readInt(); // 读取客户端发送过来的消息类型
                switch (type){
                    case 1: // 代表服务端发送过来的是 在线人数列表消息
                        receiveAllOnlineUsers();
                        break;
                    case 2: // 代表服务端发送过来的是 群聊消息
                        receiveChatMessages();
                        break;
                    case 3: // 代表服务端发送过来的是 私聊消息
                        receivePrivateChatMessages();
                        break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private void receivePrivateChatMessages() throws Exception {
        String fromUserName = dis.readUTF();
        String privateMessage = dis.readUTF();
        PrivateChatUI privateUI = privateChatWindows.get(fromUserName);
        if (privateUI == null) {
            // 当没有对应的私聊窗口时，创建一个新的私聊窗口
            // 注意：clientWindow.getUserName() 是当前用户的名称，需要在 ClientChatUI 中提供这个 getter 方法
            privateUI = new PrivateChatUI(client, fromUserName);
            // 注册新创建的私聊窗口，以便后续直接查找
            registerPrivateChatWindow(fromUserName, privateUI);
        }
        // 将接收到的消息显示到对应的私聊窗口中
        privateUI.showMessages(privateMessage);
    }

    private void receiveChatMessages() throws Exception {
        String message = dis.readUTF();
        clientWindow.showMessages(message);
    }

    private void receiveAllOnlineUsers() throws Exception {
        int size = dis.readInt();
        String[] users = new String[size];
        for (int i = 0; i < size; i++) {
            try {
                users[i] = dis.readUTF();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 更新聊天界面中的在线用户列表
        clientWindow.showOnlineUsersList(users);
    }
}
